package co.edu.udea.lab.iu.client;

import java.util.ArrayList;
import java.util.List;

import co.edu.udea.lab.iu.shared.dto.DispositivoGWT;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;


public class ListaDispositivos extends Composite {

	private static ListaDispositivosUiBinder uiBinder = GWT.create(ListaDispositivosUiBinder.class);

	interface ListaDispositivosUiBinder extends UiBinder<Widget, ListaDispositivos> {
	}
	
	@UiField
	Label labelMensaje;

	@UiField
	FlexTable tabla;
	
	@UiField
	Button viewSolicitudes;
	
	SolicitudPrestamo solicitudPrestamo;
	MisSolicitudes misSolicitudes;

	List<DispositivoGWT> dispositivos = new ArrayList<DispositivoGWT>();

	public ListaDispositivos(SolicitudPrestamo solicitudPrestamo, MisSolicitudes misSolicitudes) {
		initWidget(uiBinder.createAndBindUi(this));
		
		this.solicitudPrestamo = solicitudPrestamo;
		this.misSolicitudes = misSolicitudes;
		
		tabla.setText(0, 0, "Id");
		tabla.setText(0, 1, "Nombre");
		tabla.setText(0, 2, "Estado");
		tabla.setText(0, 3, "Acciones");
		
		tabla.getCellFormatter().setWidth(0, 0, "100px");
		tabla.getCellFormatter().setWidth(0, 1, "200px");
		tabla.getCellFormatter().setWidth(0, 2, "200px");
		tabla.getCellFormatter().setWidth(0, 3, "50px");
		
		DispositivoService.Util.getInstance().obtenerTodos("Disponible",new AsyncCallback<List<DispositivoGWT>>() {
			
			@Override
			public void onSuccess(List<DispositivoGWT> result) {
				if(result.size() == 0){
					mostrarMensaje("No se obtuvieron resultados de la consulta");
					return;
				}
				
				dispositivos = result;
				llenarTabla();
				/*for(DispositivoGWT disGwt : dispositivos){
					
					agregarDispositivo(disGwt);
				}*/
			}
			
			@Override
			public void onFailure(Throwable caught) {
				mostrarMensaje(caught.getMessage());
			}
		});
		
		viewSolicitudes.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				verSolicitudes();
			}
		});
	}
	
	private void mostrarMensaje(String mensaje){
		labelMensaje.setVisible(true);
		labelMensaje.setText(mensaje);
	}
	
	private void verSolicitudes(){
		this.setVisible(false);
		misSolicitudes.setListaDispositivos(this);
		misSolicitudes.setVisible(true);
	}
	
	private void realizarSolicitud(DispositivoGWT dispositvo){
		this.setVisible(false);
		solicitudPrestamo.setDispositivoGWT(dispositvo);
		solicitudPrestamo.idDispositivo.setText( dispositvo.getId()+""); 
		solicitudPrestamo.dispositivo.setText(dispositvo.getDescripcion()); 
		solicitudPrestamo.setListaDispositivos(this); 
		solicitudPrestamo.setVisible(true);
	}
	
	public void llenarTabla(){
		
		for(int i = 1; i < tabla.getRowCount(); i++){
			tabla.removeRow(i);
		}
		
		for(DispositivoGWT disGwt : dispositivos){
			adicionarDispositivo(disGwt);
		}
	}
	
	public void adicionarDispositivo(final DispositivoGWT dispositvo){
		
		final int indice = tabla.getRowCount();
		
		tabla.setText(indice, 0, dispositvo.getId()+"");
		tabla.setText(indice, 1, dispositvo.getDescripcion());
		tabla.setText(indice, 2, dispositvo.getEstado());
		
		Image add = new Image();
		add.setUrl("images/add.png");
		add.setTitle("Realizar solicitud de prestamo");
		tabla.setWidget(indice, 3, add);
	
		add.addClickHandler(new ClickHandler() {
		
			@Override
			public void onClick(ClickEvent event) {
				realizarSolicitud(dispositvo);
			}
		});
	}
}
